package com.zpark.se.thread;

import java.util.Arrays;

/**
 * 课程回顾：
 *      字符输出流：FileWriter
 *      字符缓冲输出流：BufferedWriter
 *      将字节输出流转为字符输出流的转换流：OutputStreamWriter
 *      序列化：将对象转为字节数组存储的过程   ObjectOutputStream
 *      反序列化：将字节数组转为对象的过程  ObjectInputStream
 *      序列化编号：默认为1L
 *      CUP执行任务的方式为轮询
 *      进程：
 *      线程：
 *      并发模式：
 *          1、多进程 + 单线程
 *          2、单进程 + 多线程
 *          3、多进程 + 多线程
 *      创建线程的方式：
 *          1、继承Thread类，重写run方法
 *          2、实现Runnable接口，重写run方法
 *          3、实现Callable接口，重写call方法，这种方式创建的线程是有返回值的
 *      线程的五态：新建，就绪，运行，阻塞，结束
 */
public class Demo05 {
    public static void main(String[] args) {
        // 线程类Thread常用方法
        Thread t = new Thread(() -> System.out.println("T线程执行了"));

        /*
         interrupt()：中断此线程。
         */
        // t.interrupt();

        /*
         isAlive()：测试此线程是否处于活动状态。
         */
        boolean alive = t.isAlive();
        System.out.println(alive);

        /*
         isDaemon()：测试此线程是否为守护线程。
         */
        boolean daemon = t.isDaemon();
        System.out.println(daemon);

        /*
         isInterrupted()：测试此线程是否已中断。
         */
        boolean interrupted = t.isInterrupted();
        System.out.println(interrupted);

        /*
         join()：等待此线程终止。
         */
       /* try {
            t.join(); // 永久等待
            t.join(5000); // 指定等待时长
        } catch (InterruptedException e) {
            e.printStackTrace();
        }*/

        /*
        setContextClassLoader()：设置此线程的上下文类加载器。
         */
        // t.setContextClassLoader();

        /*
        setDaemon()：将此线程标记为守护线程。true:为守护线程，false:为用户线程
         */
        t.setDaemon(false);

        /*
        setName()：设置此线程的名称。
         */
        t.setName("自定义线程");

        /*
        setPriority()：设置此线程的优先级。
        取值范围为：1~10, 默认值5
        JVM自动把1（低）~10（高）的优先级映射到操作系统实际优先级上（不同操作系统有不同的优先
        级数量）。优先级高的线程被操作系统调度的优先级较高，操作系统对高优先级线程可能调度更频繁，
        但我们决不能通过设置优先级来确保高优先级的线程一定会先执行。
         */
        t.setPriority(6);

        /*
         getState()：返回此线程的当前状态。
         */
        Thread.State state = t.getState();
        System.out.println("当前线程状态：" + state);

        /*
        start()：启动此线程。将线程的状态修改为就绪状态
         */
        t.start();

        /*
         getState()：返回此线程的当前状态。
         */
        state = t.getState();
        System.out.println("当前线程状态：" + state);

        System.out.println("*******************************");

        /*
         * checkAccess()：确定当前运行的线程是否具有修改此线程的权限。
         * 如果存在安全管理器，则使用此线程作为参数调用其checkAccess方法。这可能
         * 导致抛出SecurityException。
         */
        t.checkAccess();

        /*
         * getContextClassLoader()：返回此线程的上下文类加载器。
         */
        ClassLoader loader = t.getContextClassLoader();

        /*
         * getId()：返回此线程的ID。
         */
        long l = t.getId();
        System.out.println(l);

        /*
         getName()：返回此线程的名称。
         */
        String name = t.getName();
        System.out.println(name);

        /*
         getPriority()：返回此线程的优先级。
         */
        int priority = t.getPriority();
        System.out.println(priority);

        /*
         getStackTrace()：返回此线程的堆栈跟踪信息。
         */
        StackTraceElement[] stackTrace = t.getStackTrace();
        System.out.println(Arrays.toString(stackTrace));

        /*
         getState()：返回此线程的当前状态。
         */
        state = t.getState();
        System.out.println(state);

        /*
         getThreadGroup()：返回此线程的线程组。
         */
        ThreadGroup group = t.getThreadGroup();

        /*
         getUncaughtExceptionHandler()：返回此线程的未捕获异常处理器。
         */
        Thread.UncaughtExceptionHandler handler = t.getUncaughtExceptionHandler();
    }
}
